package Servicios;

import java.util.List;

import Negocio.Cliente;
import Negocio.CuentaCorriente;
import Negocio.EmpresaRegular;
import Persistencia.IRepository;
import Persistencia.QueryParameter;
import Persistencia.Repository;
import Persistencia.RepositoryException;


/**
 * DAO de Cliente (Singleton)
 * Esta clase se encarga de brindar las funciones necesarias para manejar los <b>Clientes</b> en la base de datos.
 * Podremos obtener todos los clientes, un cliente en particular, guardar o actualizar un cliente y eliminar un cliente.
 *
 */
public class ServicioClientes {
	private IRepository<Cliente> repositorioClientes;
	private static ServicioClientes instance = null;
	
	private ServicioClientes() {
		this.repositorioClientes = new Repository<Cliente>();
	}
	
	public static ServicioClientes getInstance() {
		if (instance == null) {
			instance = new ServicioClientes();
		}
		return instance;
	}
	
	/**
	 * Funcion que retorna todos los clientes de la base de datos
	 * @return List<Cliente> clientes
	 * @throws ServiceException
	 */
	public List<Cliente> getClientes() throws ServiceException {
		List<Cliente> clientes;
		
		try {
			clientes = this.repositorioClientes.getAll(Cliente.class);
		} catch (RepositoryException e) {
			throw new ServiceException(e);
		}	
		
		return clientes;
	}
	
	/**
	 * Se crea el cliente en caso de que el mismo no exista en la base de datos, de existir se realiza una actualizacion.
	 * @param Cliente cliente
	 * @throws ServiceException
	 */
	public void guardarOActualizar(Cliente cliente) throws ServiceException {
		try {
			this.repositorioClientes.saveOrUpdate((Cliente)cliente);
		} catch (RepositoryException e) {
			throw new ServiceException(e);
		}
	}

	
	public Cliente getCliente(String clienteId) throws RepositoryException {
		String queryExpression = "from Cliente c where c.clienteId = :clienteId";
		QueryParameter parameter = new QueryParameter("clienteId", clienteId);
		Cliente cliente = this.repositorioClientes.get(queryExpression, parameter);
		
		return cliente;
	}
	
	public Boolean existeCliente(String cliente_id) throws RepositoryException {
		return this.getCliente(cliente_id) != null;
	}

	/**
	 * Funcion para eliminar un cliente de la base de datos
	 * @param Cliente cliente
	 * @throws RepositoryException
	 */
	public void eliminarCliente(Cliente cliente) throws RepositoryException {
		this.repositorioClientes.delete(cliente);
	}
}
